package com.leetcode.demo;

import java.util.HashMap;
import java.util.Map;

/**
 * @author 王溪源
 * @ClassName: Question13
 * @Description: 罗马数字转整数
 * @Date 2021/8/22 0:16
 **/
public class Question13 {
    private static Map<String, Integer> map = new HashMap<> ();

    static {
        // 通常情况下，罗马数字中小的数字在大的数字的右边
        map.put ("I", 1);
        map.put ("V", 5);
        map.put ("X", 10);
        map.put ("L", 50);
        map.put ("C", 100);
        map.put ("D", 500);
        map.put ("M", 1000);

        map.put ("IV", 4);
        map.put ("IX", 9);
        map.put ("XL", 40);
        map.put ("XC", 90);
        map.put ("CD", 400);
        map.put ("CM", 900);
    }

    public static int romanToInt(String s) {
        int sum = 0;
        for (int i = 0; i < s.length (); i++) {
            // 最后一个字符
            if (i == s.length () - 1) {
                sum += map.get (s.substring (i));
            } else {
                // 小的数字在右边的情况需要特殊对待
                if (map.get (s.substring (i, i + 1)) < map.get (s.substring (i + 1, i + 2))) {
                    sum += map.get (s.substring (i, i + 2));
                    i++;
                } else {
                    sum += map.get (s.substring (i, i + 1));
                }
            }
        }
        return sum;
    }

    /**
     * 把小值放在大值左边就做减法， 否则做加法
     * 这种解题思路更优
     */
    public int romanToInt2(String s) {
        int sum = 0;
        int preNum = getValue(s.charAt(0));
        for(int i = 1;i < s.length(); i ++) {
            int num = getValue(s.charAt(i));
            if(preNum < num) {
                sum -= preNum;
            } else {
                sum += preNum;
            }
            preNum = num;
        }
        sum += preNum;
        return sum;
    }

    private int getValue(char ch) {
        switch(ch) {
            case 'I': return 1;
            case 'V': return 5;
            case 'X': return 10;
            case 'L': return 50;
            case 'C': return 100;
            case 'D': return 500;
            case 'M': return 1000;
            default: return 0;
        }
    }

    public static void main(String[] args) {
        System.out.println (romanToInt ("III"));
        // 1000 + 900  + 90 + 4
        System.out.println (romanToInt ("MCMXCIV"));
        // 1000 + 500 + 60 + 16
        System.out.println (romanToInt ("MCDLXXVI"));
    }

}
